package util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * <p>
 * Title: HTML相关的正则表达式工具类
 * </p>
 * <p>
 * Description: 包括过滤HTML标记，转换HTML标记，替换特定HTML标记
 * </p>
 * <p>
 * Copyright: Copyright (c) 2006
 * </p>
 * 
 * @author chenghengyan
 * @version 1.0
 * @createtime 2012-11-16
 */

public class HtmlRegexpUtil {
  private final static String regxpForHtml = "<([^>]*)>"; // 过滤所有以<开头以>结尾的标签

  @SuppressWarnings("unused")
  private final static String regxpForImgTag = "<*>"; // 找出IMG标签

  @SuppressWarnings("unused")
  private final static String regxpForImaTagSrcAttrib = "src=\"([^\"]+)\""; // 找出IMG标签的SRC属性

  /**
	 * 
	 */
  public HtmlRegexpUtil() {
  }

  /**
   * 
   * 基本功能：替换标记以正常显示
   * <p>
   * 
   * @param input
   * @return String
   */
  public String replaceTag(String input) {
    if (!hasSpecialChars(input)) {
      return input;
    }
    StringBuffer filtered = new StringBuffer(input.length());
    char c;
    for (int i = 0; i <= input.length() - 1; i++) {
      c = input.charAt(i);
      switch (c) {
        case '<':
          filtered.append("&lt;");
          break;
        case '>':
          filtered.append("&gt;");
          break;
        case '"':
          filtered.append("&quot;");
          break;
        case '&':
          filtered.append("&amp;");
          break;
        default:
          filtered.append(c);
      }

    }
    return (filtered.toString());
  }

  /**
   * 
   * 基本功能：判断标记是否存在
   * <p>
   * 
   * @param input
   * @return boolean
   */
  public boolean hasSpecialChars(String input) {
    boolean flag = false;
    if ((input != null) && (input.length() > 0)) {
      char c;
      for (int i = 0; i <= input.length() - 1; i++) {
        c = input.charAt(i);
        switch (c) {
          case '>':
            flag = true;
            break;
          case '<':
            flag = true;
            break;
          case '"':
            flag = true;
            break;
          case '&':
            flag = true;
            break;
        }
      }
    }
    return flag;
  }

  /**
   * 
   * 基本功能：过滤所有以"<"开头以">"结尾的标签
   * <p>
   * 
   * @param str
   * @return String
   */
  public static String filterHtml(String str) {
    Pattern pattern = Pattern.compile(regxpForHtml);
    Matcher matcher = pattern.matcher(str);
    StringBuffer sb = new StringBuffer();
    boolean result1 = matcher.find();
    while (result1) {
      matcher.appendReplacement(sb, "");
      result1 = matcher.find();
    }
    matcher.appendTail(sb);
    return sb.toString();
  }

  /**
   * 
   * 基本功能：过滤指定标签
   * <p>
   * 
   * @param str
   * @param tag
   *        指定标签
   * @return String
   */
  public static String fiterHtmlTag(String str, String tag) {
    String regxp = "<*" + tag + "*>";
    Pattern pattern = Pattern.compile(regxp);
    Matcher matcher = pattern.matcher(str);
    StringBuffer sb = new StringBuffer();
    boolean result1 = matcher.find();
    while (result1) {
      matcher.appendReplacement(sb, "");
      result1 = matcher.find();
    }
    matcher.appendTail(sb);
    return sb.toString();
  }

  /**
   * 
   * 基本功能：替换指定的标签
   * <p>
   * 
   * @param str
   * @param beforeTag
   *        要替换的标签
   * @param tagAttrib
   *        要替换的标签属性值
   * @param startTag
   *        新标签开始标记
   * @param endTag
   *        新标签结束标记
   * @return String
   * @如：替换img标签的src属性值为[img]属性值[/img]
   */
  public static String replaceHtmlTag(String str, String beforeTag, String tagAttrib, String startTag, String endTag) {
    String regxpForTag = "<*" + beforeTag + "*>";
    String regxpForTagAttrib = tagAttrib + "=\"([^\"]+)\"";
    Pattern patternForTag = Pattern.compile(regxpForTag);
    Pattern patternForAttrib = Pattern.compile(regxpForTagAttrib);
    Matcher matcherForTag = patternForTag.matcher(str);
    StringBuffer sb = new StringBuffer();
    boolean result = matcherForTag.find();
    while (result) {
      StringBuffer sbreplace = new StringBuffer();
      Matcher matcherForAttrib = patternForAttrib.matcher(matcherForTag.group(1));
      if (matcherForAttrib.find()) {
        matcherForAttrib.appendReplacement(sbreplace, startTag + matcherForAttrib.group(1) + endTag);
      }
      matcherForTag.appendReplacement(sb, sbreplace.toString());
      result = matcherForTag.find();
    }
    matcherForTag.appendTail(sb);
    return sb.toString();
  }
}
